恶意样本分析-CodeBlock

初步接触

5.28火绒发布了一篇分析报告:警惕GitHub恶意病毒项目,持续活跃释放远控木马

github上的原项目已经不见了,压缩包的哈希为2baa36ebea1ad309fa1083845b0510d4ea439bd52463c67dc1376a722c2e9fbb,可以在分析恶意样本的网站中搜索到。

![CodeBlock-1](../../_ resource/CodeBlock-1.png)

程序是一个32位程序,但是所有压缩包下的所有dll都是64位的,我闻到了一丝天堂之门的味道。编译器是Embarcadero Delphi,经过搜索发现这个是Turbo Pascal语言的编译器(很奇怪,Pascal语言里面居然能够使用天堂之门!)

微步沙箱的分析报告如下:

![CodeBlock-2](../../_ resource/CodeBlock-2.png)

样本行为分析

运行样本

首先尝试直接运行,观察直观的影响(注意这是一个使用了天堂之门的样本,虽然程序是32位的,但是必须在64位系统下才能进行行为分析)。在任务管理器当中可以发现样本会使用cmd进行一些命令行操作,初步推测目的是提权和持续化。

![CodeBlock-4](../../_ resource/CodeBlock-4.png)

另外,程序还会解密出部分文件保存在AppData\Roaming目录下 ,最后的这个可执行文件行为暂不明确,但是同样会使用cmd

![CodeBlock-3](../../_ resource/CodeBlock-3.png)

程序的压缩包中还有两个.bin文件,文件中含有Inno Setup data字样,或许是某种待解密的文件

![CodeBlock-5](../../_ resource/CodeBlock-5.png)

分析样本

CodeBlock部分

![CodeBlock-6](../../_ resource/CodeBlock-6.png)

程序在此处会解密.bin文件,解密之后会释放出前面提到的AppData\Roaming的bigmouth.ai、nighttime.xlsx、relay.dll、UIxMarketPlugin.dll、UniversalInstaller.exe。

UniversalInstaller.exe部分-relay.dll

接下来分析UniversalInstaller.exe,通过调试发现,在此处程序会扫描电脑当中的部分目录。

![CodeBlock-7](../../_ resource/CodeBlock-7.png)

同样程序还会加载同路径下的relay.dll。

![CodeBlock-9](../../_ resource/CodeBlock-9.png)

分析relay.dll,可以发现dll会加载一些文件并进行一些运算(或许是对某个文件的解密操作)

![CodeBlock-10](../../_ resource/CodeBlock-10.png)

经过调试,发现程序会加载同目录下的xlsx文件并解密

![CodeBlock-11](../../_ resource/CodeBlock-11.png)

调试进入relay.dll可以看到这样的代码

![CodeBlock-12](../../_ resource/CodeBlock-12.png)

![CodeBlock-13](../../_ resource/CodeBlock-13.png)

经过调试可以发现,样本这里会对xlsx文件进行解密

![CodeBlock-14](../../_ resource/CodeBlock-14.png)

解密的内容如下

![CodeBlock-15](../../_ resource/CodeBlock-15.png)

前面的三个字符串LoadLibraryA..VirtualProtect..dbghelp.dll应该分别代表着程序会调用的函数和加载的dll。

![CodeBlock-16](../../_ resource/CodeBlock-16.png)

运行至此处,dbghelp.dll被加载进来,此时跟进result可以看见文件,先dump一份此dll文件。后面还有对于dll的后续操作。回到之前的代码当中,如下是一段对dbghelp.dll进行操作的逻辑

if ( result )
      {
        v23 = result;
        v24 = (v22 + v18);
        v25 = *v24;
        result = kernel32_GetProcAddress(v38[0], &v24[v25 + 1]);
        v38[0] = result;
        if ( result )
        {
          v26 = &v24[v25];
          v27 = *v26;
          v37 = &v26[v27 + 1];
          result = v23();                       // LoadLibraryA dbghelp.dll
          if ( result )
          {
            v28 = result;
            v29 = &v26[v27];
            v30 = *v29;
            v39 = *&v29[v30 + 8];
            v40 = &v29[v30 + dword_1015AC63 + v39];
            v31 = *(v28 + *(v28 + 0x3C) + 0x2C) + v28;
            v41 = v31 + *&v29[v30 + 4];
            v38[0] = 0;
            v36 = v38;
            v35 = dword_1015AC77;
            v34 = v39;
            v37();
            (unk_1000805D)(v38);
            (v37)(v31, v38, v34, &v34);
            if ( *off_1015AC83 )
            {
              v32 = 0;
              do
              {
                *(v17 + 2 * v32) = off_1015AC83[v32];
                v33 = v32 + 1;
                v6 = off_1015AC83[++v32] == 0;
              }
              while ( !v6 );
            }
            else
            {
              v33 = 0;
            }
            *(v17 + 2 * v33) = 0;
            v36 = v17;
            v35 = v31;
            LOBYTE(v37) = 1;
            return v34(&v35);
          }
        }
      }

这段代码中使用了VirtualProtect函数,似乎是对dll的内容进行修改。运行之后对dll再进行dump

![CodeBlock-17](../../_ resource/CodeBlock-17.png)

通过对比发现两个dll的哈希并不相同,同时对比不同段的哈希,可以发现程序主要是对text中的内容进行了修改

![CodeBlock-18](../../_ resource/CodeBlock-18.png)

UniversalInstaller.exe部分-dbghelp.dll

回到代码当中,程序会在return时调用一个函数,调试进去

![CodeBlock-19](../../_ resource/CodeBlock-19.png)

这里样本在动态加载一些函数供后续调用,继续调试

![CodeBlock-20](../../_ resource/CodeBlock-20.png)

这里样本将同目录中释放的bigmouth.ai文件加载进内存,应该是准备用来解密。

![CodeBlock-21](../../_ resource/CodeBlock-21.png)

运行到如下位置时跟进v31可以在内存中找到解密完成的bigmouth.ai文件位置

![CodeBlock-22](../../_ resource/CodeBlock-22.png)

![CodeBlock-23](../../_ resource/CodeBlock-23.png)

继续运行,样本会把pla.dll加载进来

![CodeBlock-24](../../_ resource/CodeBlock-24.png)

先把pla.dllDUMP出来,继续调试会进入pla.dll

UniversalInstaller.exe部分-pla.dll

![CodeBlock-25](../../_ resource/CodeBlock-25.png)

在pla.dll中同样有很多动态加载函数的代码,调试进入函数之后有近一千行代码,这里全部跳过,此时会发现

![CodeBlock-27](../../_ resource/CodeBlock-27.png)

证明此前样本创建的ruzNode_test备份文件夹恰好在这部分代码当中创建。

![CodeBlock-28](../../_ resource/CodeBlock-28.png)

经过测试exe的哈希完全一致。根据IDA的报错来看,这个代码把ruzNode_test目录当中的UniversalInstaller.exe拉进来运行了,两个文件的哈希一致则行为一致。则pla.dll中执行的代码就是将UniversalInstaller.exe解密到ruzNode_test目录当中。

ruzNode_test/UniversalInstaller.exe部分

现在来调试ruzNode_test目录当中的UniversalInstaller.exe。调试进入pla.dll内部后,可以发现程序调用了shdocvw.dll。

![CodeBlock-29](../../_ resource/CodeBlock-29.png)

![CodeBlock-31](../../_ resource/CodeBlock-31.png)

继续在pla.dll中调试,出现了路径

![CodeBlock-30](../../_ resource/CodeBlock-30.png)

![CodeBlock-32](../../_ resource/CodeBlock-32.png)

C:\Users\USERUN~1\AppData\Local\Temp\5f14e736,这段内存的附近还有如下内容

![CodeBlock-33](../../_ resource/CodeBlock-33.png)

![CodeBlock-34](../../_ resource/CodeBlock-34.png)

![CodeBlock-35](../../_ resource/CodeBlock-35.png)

后续还有一些奇怪的函数调用

![CodeBlock-36](../../_ resource/CodeBlock-36.png)

CreatePipe 创建管道,并将指定的管道大小分配给存储缓冲区。 CreatePipe 还会创建句柄,进程在后续调用 ReadFile 和 WriteFile 函数时使用该句柄从缓冲区读取和写入缓冲区。

为了从管道读取数据,进程在调用 ReadFile 函数时使用读取句柄。 当以下情况之一为 true 时,ReadFile 将返回:在管道的写入端完成写入操作、已读取请求的字节数或发生错误。

当进程使用 WriteFile 写入匿名管道时,写入操作在写入所有字节之前不会

程序在这附近运行C:\Windows\SysWOW64\cmd.exe并通过pipe与cmd通信,运行cmd的函数调用如下

![CodeBlock-37](../../_ resource/CodeBlock-37.png)

继续调试,跟进到一处函数发现了爆红。

![CodeBlock-38](../../_ resource/CodeBlock-38.png)

![CodeBlock-39](../../_ resource/CodeBlock-39.png)

![CodeBlock-40](../../_ resource/CodeBlock-40.png)

众望所归,我们发现了天堂之门的特征。此处也解释了前面的问题:天堂之门并不在CodeBlock部分,而是存在于程序本体释放的文件。

![CodeBlock-42](../../_ resource/CodeBlock-42.png)

0x23处即为天堂之门结束的部分。

![CodeBlock-43](../../_ resource/CodeBlock-43.png)

可以发现此处进行了系统调用,继续运行。

![CodeBlock-44](../../_ resource/CodeBlock-44.png)

此处进行了回车换行,证明向cmd的输入已经结束了。继续运行程序结束,看来还有后续代码注入到了其他程序里面。

![CodeBlock-45](../../_ resource/CodeBlock-45.png)

这里这个快捷方式连接的是UniversalInstaller.exe,目的是持续化威胁。

在C:\Users\USERUN~1\AppData\Local\Temp目录下还有shellcode,程序会将shellcode解密之后注入到cmd中,最后程序会使用Remcos远程控制程序控制用户计算机

![CodeBlock-46](../../_ resource/CodeBlock-46.png)

IP是195.54.170.36

样本行为总结

总体上分析,该样本通过对压缩包内的资源文件进行解密,隐藏其真正的行为,并通过复杂的注入、调用和天堂之门技术增大逆向分析的难度,同时绕过杀毒软件的检测。这个样本的复杂度体现在追踪最终的恶意行为,相较于此,wannacry的代码逻辑简单得多。

![CodeBlock-47](../../_ resource/CodeBlock-47.png)

![CodeBlock-48](../../_ resource/CodeBlock-48.png)

这是两个在线工具给出的检测报告。

感悟

这个恶意样本的分析难度不小。从复杂度来看,程序在各个dll以及exe之中闪转腾挪,还有多重天堂之门保护代码。不过从使用的技术来看,并没有什么未知的隐藏恶意行为的方式,天堂之门已经是十多年前的技术了。

火绒发布了文章以后我就在陆陆续续的分析这个样本,似乎可以是逆向方向可选的就业途径。不过看起来我自己的熟练度相较于火绒那篇文章的发布者还是低了很多的。

最近也在百度病毒吧的qq群里观察了一段时间,如果掌握了一定的计算机知识,使用可靠的杀毒软件、培养一定的安全意识,普通用户也可以直接抵御计算机病毒。那么专职的此类分析岗位是否有足够多,是否有足够的必要性,这样的必要性能够支撑多久。

这是一个值得思考的问题。